﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using WorkflowWizart.Lib.Utility.ExtensionMethods;
using WorkflowWizart.Lib.Utility.ExtensionMethods;
using WorkflowWizart.Lib.Entities;

namespace WorkflowWizart.Lib.Operations
{
    public class VariableOperations
    {
        public static object Trim(object value)
        {
            if (value is ObjectData)
            {
                return value;
            }
            return value.ToStringData().Trim();
        }

        public static object IsNullOrEmpty(object value)
        {
            if (value == null)
            {
                return true;
            }
            if (!(value is ObjectData))
            {

                if (string.IsNullOrEmpty(value.ToString()))
                {

                    return true;
                }
            }
            return false;
        }

        public static object ToUpperCase(object value)
        {
            if (value is ObjectData)
            {
                return value;
            }
            return value.ToStringData().ToUpper();
        }

        public static object ToLowerCase(object value)
        {
            if (value is ObjectData)
            {
                return value;
            }
            return value.ToStringData().ToLower();
        }

        //üzerine ekleme gelen parametre tipine göre çalışıyor. 
        public static object Add(object toValue, object addValue)
        {
            if (toValue is ObjectData && addValue is ObjectData)
            {
                var addvalueObj = addValue as ObjectData;
                var toValueObj = toValue as ObjectData;
                for (int r = 0; r < toValueObj.Rows.Count; r++)
                {
                    var newRow = new ObjectRow();
                    for (int i = 0; i < addvalueObj.Fields.Count; i++)
                    {
                        if (toValueObj.Fields.Contains(addvalueObj.Fields[i]))
                        {
                            newRow[i] = toValueObj[r][addvalueObj.Fields[i].Id];
                        }
                        else
                        {
                            newRow[i] = null;
                        }
                    }
                    toValueObj.Rows.Add(newRow);
                }
                return toValueObj;
            }
            else if (toValue is ObjectData)
            {
                var data = toValue as ObjectData;
                for (int i = 0; i < data.Rows.Count; i++)
                {
                    for (int c = 0; c < data.Fields.Count; c++)
                    {
                        data.Rows[i][c] = Add(data.Rows[i][c], addValue);
                    }
                }
                return toValue;
            }
            else if (addValue is ObjectData)
            {
                var data = addValue as ObjectData;
                for (int i = 0; i < data.Rows.Count; i++)
                {
                    for (int c = 0; c < data.Fields.Count; c++)
                    {
                        toValue = Add(toValue, addValue);
                    }
                }
                return toValue;
            }
            else
            {
                if (toValue.IsDateTime())
                {
                    TimeSpan valueToAdd = new TimeSpan(0, 0, 0);
                    if (addValue.IsBool())
                    {

                    }
                    else if (addValue.IsDateTime())
                    {
                        valueToAdd = new TimeSpan(addValue.ToDateTime().Ticks);
                    }
                    else if (addValue.IsDecimal())
                    {
                        valueToAdd = new TimeSpan(addValue.ToLong());
                    }
                    else if (addValue.IsInt())
                    {
                        valueToAdd = new TimeSpan(addValue.ToInt());
                    }
                    else if (addValue.IsLong())
                    {
                        valueToAdd = new TimeSpan(addValue.ToLong());
                    }
                    else if (addValue.IsTime())
                    {
                        valueToAdd = new TimeSpan(addValue.ToDateTime().Ticks);
                    }
                    toValue.ToDateTime().Add(valueToAdd);
                }
                else if (toValue.IsDecimal())
                {
                    decimal valueToAdd = 0;
                    if (addValue.IsBool())
                    {

                    }
                    else if (addValue.IsDateTime())
                    {
                        valueToAdd = addValue.ToDateTime().Ticks;
                    }
                    else if (addValue.IsDecimal())
                    {
                        valueToAdd = addValue.ToDecimal();
                    }
                    else if (addValue.IsInt())
                    {
                        valueToAdd = addValue.ToInt();
                    }
                    else if (addValue.IsLong())
                    {
                        valueToAdd = addValue.ToLong();
                    }
                    else if (addValue.IsTime())
                    {
                        valueToAdd = addValue.ToDateTime().Ticks;
                    }
                    toValue = toValue.ToDecimal() + valueToAdd;
                }
                else if (toValue.IsInt())
                {
                    long valueToAdd = 0;
                    if (addValue.IsBool())
                    {

                    }
                    else if (addValue.IsDateTime())
                    {
                        valueToAdd = addValue.ToDateTime().Ticks;
                    }
                    else if (addValue.IsDecimal())
                    {
                        valueToAdd = addValue.ToLong();
                    }
                    else if (addValue.IsInt())
                    {
                        valueToAdd = addValue.ToInt();
                    }
                    else if (addValue.IsLong())
                    {
                        valueToAdd = addValue.ToLong();
                    }
                    else if (addValue.IsTime())
                    {
                        valueToAdd = addValue.ToDateTime().Ticks;
                    }
                    toValue = toValue.ToInt() + valueToAdd;
                }
                else if (toValue.IsLong())
                {
                    long valueToAdd = 0;
                    if (addValue.IsBool())
                    {

                    }
                    else if (addValue.IsDateTime())
                    {
                        valueToAdd = addValue.ToDateTime().Ticks;
                    }
                    else if (addValue.IsDecimal())
                    {
                        valueToAdd = addValue.ToLong();
                    }
                    else if (addValue.IsInt())
                    {
                        valueToAdd = addValue.ToInt();
                    }
                    else if (addValue.IsLong())
                    {
                        valueToAdd = addValue.ToLong();
                    }
                    else if (addValue.IsTime())
                    {
                        valueToAdd = addValue.ToDateTime().Ticks;
                    }
                    toValue = toValue.ToLong() + valueToAdd;
                }
                else if (toValue.IsTime())
                {
                    TimeSpan valueToAdd = new TimeSpan(0, 0, 0);
                    if (addValue.IsBool())
                    {

                    }
                    else if (addValue.IsDateTime())
                    {
                        valueToAdd = new TimeSpan(addValue.ToDateTime().Ticks);
                    }
                    else if (addValue.IsDecimal())
                    {
                        valueToAdd = new TimeSpan(addValue.ToLong());
                    }
                    else if (addValue.IsInt())
                    {
                        valueToAdd = new TimeSpan(addValue.ToInt());
                    }
                    else if (addValue.IsLong())
                    {
                        valueToAdd = new TimeSpan(addValue.ToLong());
                    }
                    else if (addValue.IsTime())
                    {
                        valueToAdd = new TimeSpan(addValue.ToDateTime().Ticks);
                    }
                    toValue.ToDateTime().Add(valueToAdd);
                }
                else if (toValue == null)
                {
                    object valueToAdd = null;
                    if (addValue.IsBool())
                    {
                        toValue = addValue.ToBool();
                    }
                    else if (addValue.IsDateTime())
                    {
                        toValue = addValue.ToDateTime();
                    }
                    else if (addValue.IsDecimal())
                    {
                        toValue = addValue.ToDecimal();
                    }
                    else if (addValue.IsInt())
                    {
                        toValue = addValue.ToInt();
                    }
                    else if (addValue.IsLong())
                    {
                        toValue = addValue.ToLong();
                    }
                    else if (addValue.IsTime())
                    {
                        toValue = addValue.ToDateTime().TimeOfDay;
                    }
                    else
                    {
                        toValue = addValue.ToStringData();
                    }
                }
                else
                { 
                    toValue =  toValue.ToStringData() + addValue.ToStringData(); 
                }
            }
            return toValue;
        }
    }
}
